草庐IT

c++ - Visual C++ volatile

全部标签

c++ - 通过访问函数访问共享内存是否需要 `volatile`?

[edit]对于背景阅读,要清楚,这就是我所说的:Introductiontothevolatilekeyword在查看嵌入式系统代码时,我看到的最常见错误之一是线程/中断共享数据的volatile遗漏。但是我的问题是,当通过访问函数或成员函数访问变量时,不使用volatile是否“安全”?一个简单的例子;在下面的代码中...volatileboolflag=false;voidThreadA(){...while(!flag){//Wait}...}interruptvoidInterruptB(){flag=true;}...变量flag必须是volatile以确保不会优化Thre

c++ - 在 C/C++ 中直接写入内存地址的最短代码是什么?

我正在为没有内存保护的嵌入式系统编写系统级代码(在ARMCortex-M1上,使用gcc4.3编译)并且需要直接读取/写入内存映射寄存器。到目前为止,我的代码如下所示:#defineUART00x4000C000#defineUART0CTL(UART0+0x30)volatileunsignedint*p;p=UART0CTL;*p&=~1;有没有不使用指针的更短的方法(我的意思是代码更短)?我正在寻找一种方法来编写如此短的实际分配代码(如果我不得不使用更多#defines就可以了):*(UART0CTL)&=~1;到目前为止,我尝试的任何事情都以gcc提示它无法将某些东西分配给左值

c++ - 在 C/C++ 中直接写入内存地址的最短代码是什么?

我正在为没有内存保护的嵌入式系统编写系统级代码(在ARMCortex-M1上,使用gcc4.3编译)并且需要直接读取/写入内存映射寄存器。到目前为止,我的代码如下所示:#defineUART00x4000C000#defineUART0CTL(UART0+0x30)volatileunsignedint*p;p=UART0CTL;*p&=~1;有没有不使用指针的更短的方法(我的意思是代码更短)?我正在寻找一种方法来编写如此短的实际分配代码(如果我不得不使用更多#defines就可以了):*(UART0CTL)&=~1;到目前为止,我尝试的任何事情都以gcc提示它无法将某些东西分配给左值

c++ - 标准 C++11 是否保证 `volatile atomic<T>` 具有两种语义( volatile + 原子)?

众所周知,std::atomic和volatile是不同的东西。有两个主要区别:两个优化可以用于std::atomica;,但不能用于volatileinta;:融合操作:a=1;a=2;可以由a=2;上的编译器替换不断传播:a=1;local=a;可以由a=1;local=1;上的编译器替换跨原子/volatile操作的普通读/写重新排序:为volatileinta;任何volatile读/写操作都不能重新排序。但是附近的普通读/写仍然可以围绕volatile读/写重新排序。为std::atomica;基于用于原子操作的内存屏障限制附近普通读/写的重新排序a.load(std::me

c++ - 标准 C++11 是否保证 `volatile atomic<T>` 具有两种语义( volatile + 原子)?

众所周知,std::atomic和volatile是不同的东西。有两个主要区别:两个优化可以用于std::atomica;,但不能用于volatileinta;:融合操作:a=1;a=2;可以由a=2;上的编译器替换不断传播:a=1;local=a;可以由a=1;local=1;上的编译器替换跨原子/volatile操作的普通读/写重新排序:为volatileinta;任何volatile读/写操作都不能重新排序。但是附近的普通读/写仍然可以围绕volatile读/写重新排序。为std::atomica;基于用于原子操作的内存屏障限制附近普通读/写的重新排序a.load(std::me

c++ - 如何使用 std::is_volatile?

我试图禁止对volatile类型的特定操作。为此,我尝试使用std::is_volatile,但下面的代码编译时没有错误,这不是我想要的。为什么is_volatile::valuefalse在下面的情况下?#includetemplateinlinevoidDoStuff(Tval){static_assert(!std::is_volatile::value,"Novolatiletypesplz");//...}intmain(){volatilecharsometext[261];DoStuff(sometext);} 最佳答案

c++ - 如何使用 std::is_volatile?

我试图禁止对volatile类型的特定操作。为此,我尝试使用std::is_volatile,但下面的代码编译时没有错误,这不是我想要的。为什么is_volatile::valuefalse在下面的情况下?#includetemplateinlinevoidDoStuff(Tval){static_assert(!std::is_volatile::value,"Novolatiletypesplz");//...}intmain(){volatilecharsometext[261];DoStuff(sometext);} 最佳答案

c++ - volatile关键字有什么用?

C/C++中volatile关键字有什么用?声明变量volatile和不声明为volatile有什么区别? 最佳答案 变量上的volatile限定符告诉编译器,无论何时访问此变量,它的值都必须从内存中加载,并且编译器可能不会从它以前的存储中假设该值生效了。因此,当您遇到变量可能具有当前“执行线程”(广义上)无法预见的值的情况时,它是合适的。这包括:硬件寄存器信号处理程序中的状态变量之后使用的实时变量goto等意外跳转,switch/case,或者,更重要的是,setjmp/longjmp.volatile对于对访问未互斥的线程共享变

c++ - volatile关键字有什么用?

C/C++中volatile关键字有什么用?声明变量volatile和不声明为volatile有什么区别? 最佳答案 变量上的volatile限定符告诉编译器,无论何时访问此变量,它的值都必须从内存中加载,并且编译器可能不会从它以前的存储中假设该值生效了。因此,当您遇到变量可能具有当前“执行线程”(广义上)无法预见的值的情况时,它是合适的。这包括:硬件寄存器信号处理程序中的状态变量之后使用的实时变量goto等意外跳转,switch/case,或者,更重要的是,setjmp/longjmp.volatile对于对访问未互斥的线程共享变

c++ - C++中 volatile 成员函数的目的是什么?

C++中volatile成员函数的作用是什么? 最佳答案 要回答有关“volatile成员函数”意味着什么的问题(可能是也可能不是发布问题的人最初的意图),将成员函数标记为const或volatile(或组合的constvolatile)将这些限定符应用于函数中使用的this指针。如标准所述(9.2.1“this指针”):ThetypeofthisinamemberfunctionofaclassXisX*.Ifthememberfunctionisdeclaredconst,thetypeofthisisconstX*,ifthe